<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * 
 * 
 * 
 *  DATATABLE HELPER
 * Abban az esetben ha külön szerkesztő oldalunk van,
 * és kell szerkeszt, törlés gomb
 * 
 * A paramétereket array-ban vesszük át.
 * 
 * ajax_source_site_url - datatables kéréseire válaszol 
 * table_name - a kitöltendő tábla id-je  (html view-ban)
 * table_fields - a html tábla egyes oszlopainak nevei 
 * edit_site_url - az edit oldal címe (nem ajaxos)
 * ajax_delete_site_url - az ajaxos törlés címe (paramétersoron kapja meg az id-t)
 * 
 * delete_one_warning : egy elem törlése esetén a figyelmeztetés
 * $param->delete_many_warning : több elem törlése esetén a figyelmeztetés
 * 
 * @param type $ajax_source_site_url
 * @param type table_name
 * @param type $table_fields 
 */
function get_datatable($param = array()) {
    // átkastolunk object-é hogy könnyebb legyen a haszánlat
    $param = (object) $param;

    if (!isset($param->delete_one_warning))
        $param->delete_one_warning = "Ezzel törlöd a kijelölt elemet. Biztos vagy benne?";
    if (!isset($param->delete_many_warning))
        $param->delete_many_warning = "Ezzel minden kijelölt elemet törölsz. Biztos vagy benne?";

    // innentől a dolog rögtön html(js)-ben van... :'(
    ?>
    <div id="dialog-delete-confirm" style="display: none;" title="Elemek törlése">
        <p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span><span id="delete-info-text"></span></p>
    </div>
    <div id="dialog-edit-info" style="display: none;" title="Elemek szerkesztése">
        <p><span class="ui-icon ui-icon-alert" style="float:left; margin:0 7px 20px 0;"></span><span id="edit-info-text"></span></p>
    </div>

    <script type="text/javascript" charset="utf-8">
        $(document).ready(function() {                                                                             
            // table initialization          
            oTable = $('#<?php echo $param->table_name ?>').dataTable({
                "oLanguage": {
                    "sProcessing": "Feldolgozás...",
                    "sLengthMenu": "Mutass _MENU_ bejegyzést",
                    "sZeroRecords": "Nincs ilyen bejegyzés.",
                    "sEmptyTable": "Nincs adat a táblában.",
                    "sLoadingRecords": "Bejegyzések betöltése...",
                    "sInfo": "Megjelenített bejegyzések: _START_ - _END_, összesen: _TOTAL_",
                    "sInfoEmpty": "Showing 0 to 0 of 0 entries",
                    "sInfoFiltered": "(filtered from _MAX_ total entries)",
                    "sInfoPostFix": "",
                    "sInfoThousands": ",",
                    "sSearch": "Keresés:",
                    "sUrl": "",
                    "oPaginate": {
                        "sFirst":    "Els\u0151",
                        "sPrevious": "El\u0151ző",
                        "sNext":     "Következ\u0151",
                        "sLast":     "Utolsó"
                    }
                },
                "bStateSave": true,                                                           
                "bJQueryUI": true,
                "bProcessing": true,
                "bServerSide": true,
                "sAjaxSource": "<?php echo site_url($param->ajax_source_site_url); ?>",
                "sPaginationType": "full_numbers",
                "fnServerData": function ( sSource, aoData, fnCallback ) {
                    $.ajax( {
                        "dataType": 'json', 
                        "type": "POST", 
                        "url": sSource, 
                        "data": aoData, 
                        "success": fnCallback,
                        "error": function(XMLHttpRequest, textStatus, errorThrown){
                            alert("Hiba történt: " + errorThrown.toString() + "");
                        }
                    } );
                },
                "aoColumns": [
    <?php foreach ($param->table_fields as $field_name): ?>
                        { "mDataProp": "<?php echo $field_name; ?>" }, 
    <?php endforeach; ?>                                                                                                                                                                           
                ]
            });
                                                                                                                                                                                                                                                                                
            /* Add a click handler to the rows - this could be used as a callback */
            // select element on table
            $('#<?php echo $param->table_name ?> tbody tr').live('click', function() {
                if ( $(this).hasClass('row_selected') )
                    $(this).removeClass('row_selected');
                else{
                    $(this).addClass('row_selected');
                }
            } );
                                                                                                                                                                                                                                                                                
            /*
             *
             * getting the TR nodes from DataTables
             */
            function fnGetSelected( oTableLocal )
            {
                var aReturn = new Array();
                var aTrs = oTableLocal.fnGetNodes();
                                                                                                                                                                                                                                                                                                         
                for ( var i=0 ; i<aTrs.length ; i++ )
                {
                    if ( $(aTrs[i]).hasClass('row_selected') )
                    {   
                        aReturn.push( aTrs[i] );
                    }
                }
                return aReturn;
            }
                                                                                                                                                        
    <?php
// ez a rész csak akkor kell ha nem ajaxos a szerkesztőnk, azaz
// ha volt megadva edit_site_url
    if (isset($param->edit_site_url)):
        ?>
                    // szerkesztés gomb
                    $('#edit_button').click( function() {
                        // csak akkor szerkeszthetünk elemet,
                        // ha egy vam kijelölve.
                        var allSelected = fnGetSelected( oTable );
                        if(allSelected.length != 1){
                            if(allSelected.length > 1){
                                $('#edit-info-text').html('Egyszerre csak egy elem szerkeszthető.')
                            }
                            if(allSelected.length == 0){
                                $('#edit-info-text').html('Kérlek válassz elemet a szerkesztéshez.')
                            }
                            $( "#dialog-edit-info" ).dialog({
                                resizable: false,
                                height:140,
                                modal: true,
                                buttons: {
                                    "Ok": function() {
                                        $( this ).dialog( "close" );          
                                    }
                                }
                                                                                                                                                                                                                                                                                                                                                                
                            });
                        }else{
                            // megyünk az elemet szerkeszteni
                            window.location.href = "<?php echo site_url($param->edit_site_url); ?>/"+strip_user_id(allSelected[0].getAttribute('id'));
                        }
                        return false;
                    });
        <?php
// vége van a nem ajaxos szerkesztés résznek.
    endif;
    ?>
                                                                                                                                                            
            /* Add a click handler for the delete row */
            $('#delete_button').click( function() {
                var allSelected = fnGetSelected( oTable );
                // nincs elem kiválasztva, tájékoztatjuk a usert
                $('#delete-info-text').html('Nincs elem kiválasztva!');
                if(allSelected.length == 0){
                    $( "#dialog-delete-confirm" ).dialog({
                        resizable: false,
                        height:140,
                        modal: true,
                        buttons: {
                            "Ok": function() {
                                $( this ).dialog( "close" );
                            }
                        }
                    });
                    return false;
                }
                popup_delete_confirm(allSelected);                                                                                       
                return false;
            } );
                                                                                                                                                                    
            // ezzel lehet törölni a kijelölt elemeket.
            function popup_delete_confirm(items){
                // beálltíjuk a szöveget
                if(items.length == 1){
                    $('#delete-info-text').html("<?php echo $param->delete_one_warning ?>");
                }
                else {
                    $('#delete-info-text').html("<?php echo $param->delete_many_warning ?>");
                }
                // előhuzzuk a dialogot.
                $( "#dialog-delete-confirm" ).dialog({
                    resizable: false,
                    height:140,
                    modal: true,
                    buttons: {
                        "Mégsem": function() {
                            $( this ).dialog( "close" );
                        },
                        "Törlés": function() {
                            // szépen ajaxosan töröljük az elemeket.
                            for(x in items){
                                $.get("<?php echo site_url($param->ajax_delete_site_url); ?>/"+strip_user_id(items[x].getAttribute('id')));
                            }
                            // ezzel csak újratölt
                            oTable.fnDraw();
                            $( this ).dialog( "close" );
                        }
                    }
                });
            }
                                                                                                                                                            
            function strip_user_id(user_id){
                return user_id.replace("<?php echo $param->table_fields[0]; ?>_", "");
            }
        } );   
                                                                                                                                                                
    </script>
    <?php
}

/**
 *  Datatable full ajaxos formmal
 *
 * ajax_source_site_url - datatables kéréseire válaszol 
 * table_name - a kitöltendő tábla id-je  (html view-ban)
 * table_fields - a html tábla egyes oszlopainak nevei 
 * ajax_get_form_site_url - ettől az oldaltól kérhetjük el a form-ot
 *                  ha elküldjük az id-t akkor rekord adatokkal, szerkesztünk
 *                  ha nem küldünk id,t üres formot kapunk
 * ajax_delete_site_url - az ajaxos törlés címe (paramétersoron kapja meg az id-t)
 * 

 * 
 * @param type $param 
 * 
 */
function get_datatable_modal_form($param = array()) {
    $param = (object) $param;

    // meghívjuk a sima get_datatable-t, mert az tökjó nekünk,
    // csak arra van szükségünk, hogy legyen egy 
    // felbukkanó form mentés gombbal, ami lementi az adatot,
    //  aztán frissíti a táblát
    get_datatable($param);
    // ezzel inicializálódik a tábla, és a törlés gomb.
    // szükség van az ajaxos editre, submitra, új gombra.
    ?>
    <script type="text/javascript" charset="utf-8">
        // entert ne lehessen használni submit-ra!
        $(window).keydown(function(event){
            if(event.keyCode == 13) {
                event.preventDefault();
                return false;
            }
        });
                                
        function strip_user_id(user_id){
            return user_id.replace("<?php echo $param->table_fields[0]; ?>_", "");
        }               
        /*
         *
         * getting the TR nodes from DataTables
         */
        function fnGetSelected( oTableLocal )
        {
            var aReturn = new Array();
            var aTrs = oTableLocal.fnGetNodes();
                                                                                                                                                                                                                                                                                                         
            for ( var i=0 ; i<aTrs.length ; i++ )
            {
                if ( $(aTrs[i]).hasClass('row_selected') )
                {   
                    aReturn.push( aTrs[i] );
                }
            }
            return aReturn;
        }
                                                                                
        $(document).ready(function() {      
            // Dialog setup
            $('#edit_dialog').dialog({
                width: '570px',     
                position: ( 'center' ,'top'),        
                zIndex: 10000,
                autoOpen : false,
                modal : true,
                width : 440,
                resizable: false,
                buttons : {
                    "Mentés" : function() {
                        $('#htmlAjaxForm').ajaxForm({ 
                            dataType:  'json', 
                            success: function(data) { 
                                if(data.error){
                                    $('#success_message').hide(500);
                                    $('#error_message').html(data.error).show(500); 
                                    oTable.fnDraw();
                                    $('#edit_dialog').dialog("close");
                                }else{
                                    $('#error_message').hide(500);
                                    $('#success_message').html(data.msg).show(500); 
                                    // frissítjük bezárás előtt a datatable-t
                                    oTable.fnDraw();
                                    $('#edit_dialog').dialog("close");
                                }
                            },
                            error: function(XMLHttpRequest, textStatus, errorThrown){
                                $('#error_message').html("Hiba történt: " + errorThrown.toString() + "").show(500);
                                $('#edit_dialog').dialog("close");
                            }
                        });
                        // "megnyomjuk" a submit gombot
                        $('#htmlAjaxForm').submit();
                    },
                    "Mégsem" : function() {
                        $(this).dialog("close");
                    }
                }
            });
                                                                                                                                        
            // new record
            $('#new_button').click(function() {
                // betöltünk formot
                $.ajax({
                    url: '<?php echo site_url($param->ajax_get_form_site_url); ?>',
                    data: {
                        // üres data, üres formot várunk.
                    },
                    dataType: 'html',
                                                                            
                    type: 'post',
                    success: function (data) {
                        $('#edit_dialog').html(data);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown){
                        $('#edit_dialog').html("Hiba történt: " + errorThrown.toString() + "");
                    }
                });
                                                                                                        
                $('#edit_dialog').dialog('open');
                return false;
            });
                                                                                                                                    
            // load record and edit
            $('#edit_button').click(function() {
                // csak akkor szerkeszthetünk elemet,
                // ha egy vam kijelölve.
                var allSelected = fnGetSelected( oTable );
                if(allSelected.length != 1){
                    if(allSelected.length > 1){
                        $('#edit-info-text').html('Egyszerre csak egy elem szerkeszthet\u0151.')
                    }
                    if(allSelected.length == 0){
                        $('#edit-info-text').html('Kérlek válassz elemet a szerkesztéshez.')
                    }
                    $( "#dialog-edit-info" ).dialog({
                        resizable: false,
                        height:140,
                        modal: true,
                        buttons: {
                            "Ok": function() {
                                $( this ).dialog( "close" );          
                            }
                        }
                                                                                                                                                                                                                                                                                
                    });
                    return false;
                }
                                                                
                // ha egy elem van kijelölve lekérjük az adatait form-ba
                $.ajax({
                    url: '<?php echo site_url($param->ajax_get_form_site_url); ?>',
                    data: {
                        // elküldjük az id-t, mert adatokat várunk vissza
                        id : strip_user_id(allSelected[0].getAttribute('id'))
                    },
                    dataType: 'text',
                    type: 'post',
                    success: function (data) {
                        $('#edit_dialog').html(data);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown){
                        $('#edit_dialog').html("Hiba történt: " + errorThrown.toString() + "");
                    }
                });
                $('#edit_dialog').dialog('open');
                return false;
            });
                                                                                                                                    
                                                                                                                                    
                                                                                                                  
        } );                 
    </script>
    <?php
}

/**
 * encode & format stuff to json
 * 
 * Indents a flat JSON string to make it more human-readable.
 *
 * @param type $mixed
 * @return type 
 */
function encode_json($mixed) {
    $json = json_encode($mixed);

    $result = '';
    $pos = 0;
    $strLen = strlen($json);
    $indentStr = '  ';
    $newLine = "\n";
    $prevChar = '';
    $outOfQuotes = true;

    for ($i = 0; $i <= $strLen; $i++) {

        // Grab the next character in the string.
        $char = substr($json, $i, 1);

        // Are we inside a quoted string?
        if ($char == '"' && $prevChar != '\\') {
            $outOfQuotes = !$outOfQuotes;

            // If this character is the end of an element, 
            // output a new line and indent the next line.
        } else if (($char == '}' || $char == ']') && $outOfQuotes) {
            $result .= $newLine;
            $pos--;
            for ($j = 0; $j < $pos; $j++) {
                $result .= $indentStr;
            }
        }

        // Add the character to the result string.
        $result .= $char;

        // If the last character was the beginning of an element, 
        // output a new line and indent the next line.
        if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
            $result .= $newLine;
            if ($char == '{' || $char == '[') {
                $pos++;
            }

            for ($j = 0; $j < $pos; $j++) {
                $result .= $indentStr;
            }
        }

        $prevChar = $char;
    }

    return $result;
}

/**
 *  Generate a slug: url frienly name
 * 
 * @param type $phrase
 * @param type $maxLength
 * @return type 
 */
function _generate_slug($str, $delimiter='-') {
    setlocale(LC_ALL, 'hu_HU.UTF8');
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

    return $clean;
}

/**
 *  Generate a slug: url frienly filename
 * 
 * @param type $phrase
 * @param type $maxLength
 * @return type 
 */
function _clean_filename($str, $delimiter='-') {
    setlocale(LC_ALL, 'hu_HU.UTF8');
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9\/_|+ .-]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);

    return $clean;
}

